Перейти к основному содержимому

4.02. Null

Разработчику Аналитику Тестировщику
Архитектору Инженеру

Null, Undefined, Nothing, None

null — это явное указание на отсутствие значения. Это не «ничего», а специальное значение, означающее: «здесь должно быть что-то, но сейчас — пусто». Не объект, не число, не строка — это отдельное состояние. Можно явно его присвоить - программист говорит: «я знаю, что здесь пока нет значения».

Пример:

let user = null; // известно, что пользователь не выбран

Чтобы не путать с различными значениями, которые логически - ничего, давайте сделаем таблицу.

ЗначениеЧто на самом деле означает
null«Нет значения»
0«Число ноль»
""«Пустая строка»
false«Ложное значение»
undefined«Не определено» (JS)

Возраст null → неизвестен, а возраст 0 → новорождённый. Это разные смыслы, и их нельзя путать.

undefined — это состояние «ещё не определено». Оно возникает, когда переменная объявлена, но не инициализирована, свойство объекта не существует, функция ничегоне возвращает, или параметр не передан.

Поэтому используйте null, когда намеренно хотите сказать «нет значения», а в JS сравнивайте с ===, чтобы избежать путаницы.

А теперь немного о страшном. В 2009 году Тони Хоар, создатель null в языке ALGOL, назвал это «миллиард-долларовой ошибкой». Почему null так опасен? NullPointerException (NPE) — одна из самых частых ошибок в Java, C#, JavaScript.

null не имеет методов, неявно проникает в логику программы, и если где-то логика должна, к примеру, получать объект, передавать его дальше, использовать его свойства или методы, но вместо объекта ничего не придёт - то будет та самая ошибка NPE. Поэтому нужно всегда выполнять проверку на null - это просто if (что-то == null) то, к примеру, return. Или наоборот, оборачивать нужную логику в if (что-то !== null).

Логически - «делай, только если данные есть». Искусство проверки на null в разных языках и проектах отличается, кто-то выделяет отдельные классы для проверок, кто-то использует nullable-типы (которые могут быть null).